home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
book
/
src
/
wc.c
< prev
Wrap
C/C++ Source or Header
|
1993-07-08
|
53KB
|
1,728 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <msdos.cf>
#include <system.cf>
#include <status.cf>
#include <egb.h>
#include <mos.h>
#include <fmc.h>
#include "file.h"
#include "event.h"
#include "init.h"
#include "book.h"
#include "lib.h"
#include "doslib.h"
#include "keyio.h"
#include "menu.h"
#include "mouse.h"
#define CD_NO_STOP /* CD-ROMへ移動すると、停止時間を無限大にする */
#ifdef CD_NO_STOP
# include <cdr.h>
#endif
#define MOUSE_PAGE 1 /* マウスカーソルはページ1に描く */
#define EXIT_X 594 /* 直接終了するボタン */
#define EXIT_Y 7
#define CARD_X 484
#define CARD_Y 19
#define CARD_MAX 10 /* maximum wildcard num */
#define CARD_LEN 12
#define DRV_MAX 26 /* 論理ドライブ A - Z */
#define HARD_DRV_MAX 16 /* 物理ドライブ A - P */
#define DRV_LEN 8
#define CLIP_X (DSP_X+4)
#define CLIP_Y 4
#define CLIP_SIZ 38
#define ROLL_X (DSP_X+DSP_LEN*8+4+2+2) /* スクロールボタン */
#define ROLLUP_Y (DSP_Y)
#define ROLLDOWN_Y (DSP_Y+(DSP_MAX_SLOT-1)*SPC_Y)
#define ROLL_LEN 2
#define SCROLL_X (ROLL_X) /* スクロールバー */
#define SCROLL_X_SIZ (ROLL_LEN*8+3)
#define SCROLL_Y (ROLLUP_Y+SPC_Y+4+4)
#define SCROLL_Y_SIZ (ROLLDOWN_Y-2 - SCROLL_Y - 8)
#define DSP_X 152
#define DSP_LEN 36
#define FNT_SIZ 16 /* 8 or 16 */
#define DSP_Y 28
#define DSP_MAX1 14
#define DSP_MAX2 28
#define DSP_MAX_SLOT 14
#define DSP_MAX_EVT (DSP_MAX2+5) /* DSP_MAX2 より大きければいい */
#define FNT_SPC_X 2
#define FNT_SPC_Y 1
#define SPC_Y 19 /* 一行の縦方向のドット数(全体) */
#define SIZ_Y 17 /* 一行の縦方向のドット数(文字部分) */
#define SORT_X (CARD_X)
#define SORT_Y (CARD_Y+CARD_MAX*SPC_Y+5)
#define SORT_MAX (2)
#define SORT_LEN (CARD_LEN)
#define COLUMN_X (CARD_X)
#define COLUMN_Y (SORT_Y+SORT_MAX*SPC_Y+4)
#define COLUMN_LEN (CARD_LEN)
#define ISDIR(c) (c->att&0x10)
#define ISHID(c) (c->att&0x02)
#define ISSYS(c) (c->att&0x04)
#define IS_FLP 0x00
#define IS_SCSI 0x02
#define IS_RAM 0x03
#define IS_MDC 0x04
#define IS_ROM 0x05
#define IS_CDR 0x06 /* 勝手に決めました */
#define IS_ICMC 0x07 /* 勝手に決めました */
#define IS_NON 0xFF
typedef Find_buffer find_t ;
typedef struct _WCBUF /* この構造体はアラインしない */
{
struct _WCBUF *back ;
struct _WCBUF *next ;
short int mark ;
short int att ;
unsigned short int time, date ;
unsigned long size ;
char name[14] ;
} WCBUF ;
typedef struct _CDBUF
{
short int mark, allocate ;
char *name ;
} CDBUF ;
static short disktype[DRV_MAX] =
{
IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON,
IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON,
IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON,
IS_NON, IS_NON,
} ;
static char *sort_name[] = {
" \x83\x5Cートなし ", " ファイル名 ", " 拡張子優先 ", NULL } ;
/* " ソートなし ", " ファイル名 ", " 拡張子優先 ", NULL } ; */
static char *fs_mode_name[] = { " 1段 ", " 2段 ", NULL } ;
static int CDRV = -1;
static mevt_t event = MEv_NULL;
static int click_pos = 0 ; /* パスリストのどこをクリックしたのか */
static int stat_sw ; /* マウスのスイッチ */
static char crrdir[256] ; /* 現在のカレント・ディレクトリ */
static int marked = -1 ; /* マークされているファイル */
static int DSP_MAX = DSP_MAX1 ; /* 一度に表示するファイルの数 */
int mos_disp_off = MOS_OFF ; /* マウスカーソルは消す */
static CDBUF card[ CARD_MAX ] =
{
{ TRUE, FALSE,"*.*" }, { FALSE,TRUE,NULL }, { FALSE,TRUE,NULL },
{ FALSE,TRUE,NULL }, { FALSE,TRUE,NULL }, { FALSE,TRUE,NULL },
{ FALSE,TRUE,NULL }, { FALSE,TRUE,NULL }, { FALSE,TRUE,NULL },
{ FALSE,TRUE,NULL },
} ;
typedef struct
{
int max; /* 現在のディレクトリのディレクトリエントリ数 */
int maxl; /* ファイルを表示するときの最大行数 */
int top; /* 表示中のトップ位置(番号) */
WCBUF *topwp; /* ファイルリストの先頭 */
WCBUF *twp; /* 表示中のトップ位置(リスト) */
} FILE_t ;
static FILE_t files = { 0,0,0, NULL,NULL } ;
static int vol_size = 0, bar_size = 0 ;
extern void dsp_all( int rewrite, REGS WCBUF *wp, int top ) ;
static WCBUF *wc_read( char *path, int attr )
{
static int opflg = FALSE ;
static find_t find ;
auto WCBUF *wp ;
errno = 0 ;
if( opflg == FALSE )
c_find_first( path, &find, attr ) ;
else
find_next( &find ) ;
opflg = TRUE ;
if( errno != 0 ) /* perhaps, "No More Files" */
{
opflg = FALSE ;
return NULL ;
}
if( ( wp = (WCBUF *)malloc(sizeof(WCBUF))) != NULL )
{
wp->back = wp->next = NULL ;
wp->mark = OFF ;
wp->att = find.Attr ;
wp->date = find.Date ;
wp->time = find.Time ;
wp->size = find.Size ;
strcpy( wp->name, find.Name ) ;
}
return wp ;
}
static char toup( int ch )
{
return toupper(ch) ;
}
static int patmatch( char *arg, char *nam )
{
int i, j ;
for( ; *arg != '\0' && *nam != '\0' ; )
{
i = toup( *(arg++) ) ;
j = toup( *(nam++) ) ;
if( i == '*' )
{
do {
if( ( i = toup( *(arg++)) ) == '\0' )
return TRUE ;
} while ( i == '*' || i == '?' ) ;
do {
if ( j == i && patmatch( arg, nam ) == TRUE )
return TRUE ;
} while ( (j = toup(*(nam++))) != '\0' ) ;
if( i == '.' && *arg == '*' )
return TRUE ;
else
return FALSE ;
}
else if( i != '?' && i != j )
return FALSE ;
}
if( *arg == '\0' && *nam == '\0' )
return TRUE ;
else
return FALSE ;
}
/* 拡張子があれば、その先頭のポインタなければ¥0を返す */
static char *subname( REGS char *name )
{
static char *nul = "\0" ;
auto char *p ;
if( *name == '.' || ( p = strchr( name, '.' ) ) == NULL )
name = nul ;
else
name = p + 1 ;
return name ;
}
static char *formname( char *name )
{
static char tmp[ 14 ] ;
char tmp2[ 16 ] ;
char *p = NULL ;
strcpy( tmp2, name ) ;
if( *name != '.' && ( p = strchr( tmp2, '.' ) ) != NULL )
*p++ = '\0' ; /* 拡張子あり */
/* sprintf( tmp, "%-8s %-3s", tmp2, p==NULL ? "":p ) ; */
strcpy( tmp, formstrL( tmp2, 9 ) ) ;
if( p != NULL )
strcat( tmp, formstrL( p, 3 ) ) ;
return tmp ;
}
static int cmpname( WCBUF *sp, WCBUF *dp )
{
int ret ;
if( ISDIR( sp ) != ISDIR( dp ) )
return ISDIR(sp) ? -1 : 1 ;
if( setup.sort_mode == SORT_EXT &&
( ret = strcmp( subname(sp->name), subname(dp->name) ) ) != 0 )
return ret ;
return strcmp( sp->name, dp->name ) ;
}
static WCBUF *wc_sort( WCBUF *sp, WCBUF *dp )
{
REGS WCBUF *tp ;
auto WCBUF root ; /* 番兵 */
tp = &root ;
if( ( tp->next = sp ) == NULL )
return dp ;
while( tp->next != NULL )
{
if( setup.sort_mode != SORT_NOT ) /* ソートする */
if( cmpname( tp->next, dp ) >= 0 )
break ;
tp = tp->next ;
}
/* (tp) → (tp->next) の間にdpを挿入 */
/* dp->next = tp->next ;
tp->next = dp ; */
dp->next = tp->next ;
dp->back = tp ;
tp->next = dp ;
if( dp->next != NULL )
(dp->next)->back = dp ;
return root.next ;
}
static WCBUF *wc_reset( REGS WCBUF *wp )
{
WCBUF *tp ;
while( wp != NULL )
{
tp = wp->next ;
free( wp ) ;
wp = tp ;
}
files.top = 0;
files.twp = NULL;
files.max = 0;
files.maxl = 0;
return NULL ;
}
static int wild_chk( char *file )
{
int i;
for( i = 0 ; i < CARD_MAX ; i++ )
{
if( card[i].mark && patmatch( card[i].name, file ) )
return TRUE ;
}
return FALSE ;
}
static WCBUF *wc_open( void )
{
WCBUF *topwp = NULL ;
WCBUF *wp ;
int max = 0 ;
mos_ptn( MOSCSR_CLOCK ) ;
while( ( wp = wc_read( "*.*", 0x16 ) ) != NULL )
{
if( wp->name[0] == '.' && wp->name[1] == '\0' )
free( wp ) ;
else if( ISDIR( wp ) || wild_chk( wp->name ) )
topwp = wc_sort( topwp, wp ), max ++ ;
else
free( wp ) ;
}
mos_ptn( MOSCSR_FINGER ) ;
files.max = max;
files.maxl = (max + setup.fs_mode - 1) / setup.fs_mode * setup.fs_mode;
files.top = 0;
files.twp = NULL;
return topwp ;
}
static void MENU_clip( REGS evt_t *ep, int x, int y, int sw )
{
static int lastev = -1 ;
auto int now ;
y = y ; /* 意味なし ワーニング回避 */
now = ep->now ;
switch( now )
{
case Ev_CLIP_MOS: /* 押している間はへこむ */
mos_ptn( MOSCSR_FINGER ) ;
stat_sw = sw ;
DSP_clip_on( ep ) ;
if( isrepeat( ep ) )
{
event = ep->no ;
ep->now = Ev_REP_MOS ;
}
break ;
case Ev_DOLACK_MOS: /* 押したまま、外れると戻る */
ep->now = Ev_NON ;
case Ev_MOVE_MOS:
DSP_clip_off( ep ) ;
case Ev_OFF_MOS:
mos_ptn( MOSCSR_FINGER ) ;
break ;
case Ev_REP_MOS:
if( lastev == Ev_REP_MOS )
event = ep->no ;
break ;
case Ev_SELECT_MOS: /* その場で離すと、実行 */
if( !isrepeat( ep ) )
event = ep->no ;
click_pos = ( x - ep->x1 ) / 8 ;
DSP_clip_off( ep ) ;
ep->now = Ev_ON_MOS ;
case Ev_ON_MOS: /* ボタンの上にいるときは、カーソルを変更 */
mos_ptn( MOSCSR_FINGER ) ;
break ;
}
lastev = now ;
}
static char *dsp_name( REGS WCBUF *wp, int title )
{ /* ファイル名の表示の準備 */
static char dmy[80] ;
auto int mode ;
mode = title == ON ? 1 : setup.fs_mode;
switch( mode )
{
case 2:
*dmy = ISDIR(wp) ? '<':' ' ;
strcpy( dmy+1, formstrL( formname( wp->name ), 12 ) ) ;
dmy[13] = ISDIR(wp) ? '>':' ' ;
dmy[14] = '\0' ;
break ;
default:
if( title )
strcpy( dmy, formstrL( wp->name, 13 ) ) ;
else
strcpy( dmy, formstrL( formname( wp->name ), 13 ) ) ;
if( ISDIR( wp ) )
/* sprintf( dmy + 13, " <DIR> " ) ; */
strcat( dmy, " <DIR> " ) ;
else
/* sprintf( dmy + 13, "%8ld ", wp->size ) ; */
strcat( dmy, formdigitR( wp->size, 8, NO ) ),
strcat( dmy, " " ) ;
/* sprintf( dmy + 22,"%02d-%02d-%02d %02d:%02d",
80+(wp->date >> 9), (wp->date >> 5) & 0x0F, wp->date & 0x1F,
wp->time >> 11, (wp->time >> 5) & 0x3F ) ; */
strcat( dmy,formdigitL( 80+(wp->date>>9), 2,YES )); strcat(dmy,"-") ;
strcat( dmy,formdigitL( (wp->date>>5)&0x0F, 2,YES )); strcat(dmy,"-");
strcat( dmy,formdigitL( wp->date & 0x1F, 2,YES )); strcat(dmy," ");
strcat( dmy,formdigitL( wp->time >> 11, 2,YES )); strcat(dmy,":");
strcat( dmy,formdigitL( (wp->time>>5)&0x3F, 2,YES ));
break ;
}
return dmy ;
}
static WCBUF *jump( int num ) /* num 番目の要素までジャンプする */
{
WCBUF *wp = files.twp != NULL ? files.twp : files.topwp ;
int top = files.top ;
if( top == num || wp == NULL ) /* 現在と同じ */
;
else if( top < num )
for( ; wp->next != NULL && top < num ; top++ )
wp = wp->next ;
else if( top > num )
for( ; wp->back != NULL && top > num ; top-- )
wp = wp->back ;
return wp ;
}
/* スクロール・バーのクリップ */
static void MOVE_clip(REGS evt_t *ep, int x, int y, int sw)
{
WCBUF *wp;
int pos;
x = x, sw = sw ; /* 意味なし。ワーニングを避けるため */
switch (ep->now)
{
case Ev_ON_MOS:
mos_ptn(MOSCSR_HAND);
break;
case Ev_CLIP_MOS:
mos_ptn(MOSCSR_HAND);
MOS_horizon(ep->x1, ep->x2);
MOS_vertical(ep->y1, ep->y2);
ep->now = Ev_REP_MOS;
case Ev_REP_MOS:
event = MEv_NULL;
if (vol_size > 0)
{
pos = files.maxl * (y - ep->y1) / SCROLL_Y_SIZ;
if (pos + DSP_MAX > files.maxl)
if ((pos = files.maxl - DSP_MAX) < 0)
pos = 0;
pos -= pos % setup.fs_mode;
if ((wp = jump(pos)) != files.twp)
dsp_all(FALSE, wp, pos);
}
break;
case Ev_OFF_MOS:
mos_ptn( MOSCSR_FINGER ) ;
case Ev_SELECT_MOS:
MOS_horizon( 2, 630 ) ;
MOS_vertical( 0, 470 ) ;
event = ep->no;
break;
}
}
/* スクロールバー */
static void DSP_scr_bar(int rewrite)
{
const short x1 = SCROLL_X ;
const short x2 = SCROLL_X + SCROLL_X_SIZ ;
static char *bak = NULL ;
static short last_max = -1 ;
static short last_pos = -1 ;
auto short bar_pos, diff ;
static struct {
char *ptn ;
u_short ds, x1,y1, x2,y2 ;
} param ;
/* ファイルが0のときは、スクロールバーを消去しておしまい */
if (rewrite || files.max == 0)
{
dsp_box(x1,SCROLL_Y-4, x2,SCROLL_Y+SCROLL_Y_SIZ+4,
WIND_COL,WIND_COL,WIND_COL);
if (files.max == 0)
return ;
}
/* 余白の合計の大きさ */
if ((bar_size = SCROLL_Y_SIZ * DSP_MAX / files.maxl) > SCROLL_Y_SIZ)
bar_size = SCROLL_Y_SIZ-1;
vol_size = SCROLL_Y_SIZ - bar_size;
bar_pos = files.top * SCROLL_Y_SIZ / files.maxl;
/* 初回は、ぜんぶ真面目に描く */
if (bak == NULL || rewrite)
{
/* 枠 */
dsp_box( x1,SCROLL_Y-4, x2,SCROLL_Y+SCROLL_Y_SIZ+4,
BOX1_COL,BOX2_COL, WIND_COL ) ;
dsp_box( x1+8,SCROLL_Y-1, x2-8,SCROLL_Y+SCROLL_Y_SIZ/*+1*/,
BLACK,BLACK, WHITE_l ) ;
if (bak == NULL)
{
bak = malloc( (SCROLL_X_SIZ+7)/8*8*(SCROLL_Y_SIZ+1)/2 ) ;
if( bak != NULL )
{
param.ptn = bak ;
param.ds = getds() ;
param.x1 = x1 ;
param.y1 = SCROLL_Y ;
param.x2 = x2 ;
param.y2 = SCROLL_Y+SCROLL_Y_SIZ+1 ;
EGB_getBlock( gwork, (char *)¶m ) ;
}
}
pbox(x1+2,SCROLL_Y+bar_pos, x2-2,SCROLL_Y+bar_pos+bar_size,
WHITE_h,WHITE_h);
}
else /* 2回目以降は、手抜きする */
{
/* 表示上の差がなければ描画はしない */
if (last_max != files.maxl)
{ /* スクロール・バーの大きさが変わった */
param.y1 = SCROLL_Y;
param.y2 = SCROLL_Y + SCROLL_Y_SIZ;
EGB_putBlock( gwork, 0, (char *)¶m ) ;
pbox( x1+2,SCROLL_Y+bar_pos,
x2-2,SCROLL_Y+bar_pos+bar_size, WHITE_h,WHITE_h ) ;
}
else if( ( diff = bar_pos - last_pos ) < 0 )
{ /* スクロール・バーの差分だけを描く */
param.y1 = SCROLL_Y + bar_pos + bar_size + 1 ;
param.y2 = SCROLL_Y + last_pos + bar_size ;
EGB_putBlock( gwork, 0, (char *)¶m ) ;
if( last_pos - bar_pos > bar_size )
last_pos = bar_pos + bar_size ;
pbox( x1+2,SCROLL_Y+bar_pos,
x2-2,SCROLL_Y+last_pos, WHITE_h,WHITE_h ) ;
}
else if( diff > 0 )
{
param.y1 = SCROLL_Y + last_pos ;
param.y2 = SCROLL_Y + bar_pos ;
EGB_putBlock( gwork, 0, (char *)¶m ) ;
if( bar_pos - last_pos > bar_size )
last_pos = bar_pos - bar_size ;
pbox( x1+2,SCROLL_Y+last_pos+bar_size,
x2-2,SCROLL_Y+bar_pos+bar_size, WHITE_h,WHITE_h ) ;
}
}
last_max = files.maxl;
last_pos = bar_pos ;
}
static void dsp_mark(int pos)
{
int xpos, ypos, xsiz;
xpos = DSP_X + 2 + (setup.fs_mode == 2 ? (pos % 2) * 148 + 4 : 0);
xsiz = setup.fs_mode == 2 ? 134 : (DSP_LEN * 8 + 2);
ypos = DSP_Y + 1 + (setup.fs_mode == 2 ? (pos / 2) : pos) * SPC_Y;
EGB_writeMode(gwork, 4 /* xor */);
pbox(xpos,ypos, xpos+xsiz,ypos+SIZ_Y-2, WIND_COL,WIND_COL);
EGB_writeMode(gwork, 0 /* pset */);
}
static void dsp_clear_slot(int pos)
{
int xpos, ypos, xsiz;
xpos = DSP_X + 2 + (setup.fs_mode == 2 ? (pos % 2) * 148 + 4 : 0);
xsiz = setup.fs_mode == 2 ? 134 : (DSP_LEN * 8 + 2);
ypos = DSP_Y + 1 + (setup.fs_mode == 2 ? (pos / 2) : pos) * SPC_Y;
pbox(xpos,ypos, xpos+xsiz,ypos+SIZ_Y-2, WIND_COL,WIND_COL);
}
static void dsp_file(WCBUF *wp, mevt_t pos, int rewrite, int evt)
{
int xpos, ypos, xsiz;
xpos = DSP_X + 1 + (setup.fs_mode == 2 ? (pos%2)*148+4 : 0);
xsiz = setup.fs_mode == 2 ? 136 : (DSP_LEN*8+4);
ypos = DSP_Y + (setup.fs_mode == 2 ? (pos / 2) : pos) * SPC_Y;
if (rewrite)
box2(xpos,ypos, xpos+xsiz,ypos+SIZ_Y, BOX1_COL,BOX2_COL);
wrt(dsp_name(wp, OFF), xpos+(setup.fs_mode==2 ? 13:1),ypos+1,
(ISHID(wp) || ISSYS(wp))? BLACK_l:WHITE_h,WIND_COL, FNT_SIZ);
if (wp->mark == ON)
dsp_mark(pos);
if (evt)
EVT_set_node(xpos,ypos, xsiz,SIZ_Y, 1,MENU_clip,MEv_MAX + pos, NOP);
}
/* ファイル名の一覧表示 */
static void dsp_all(int rewrite, WCBUF *wp, int top)
{
int i;
char tmp[128];
char *p;
EVT_level_free(1);
MOS_disp(mos_disp_off);
/* カレント・ディレクトリ表示 */
strcpy(tmp, crrdir);
if ((p = jstrrchr(tmp, '\\')) != NULL && strlen(tmp) > 3)
*p = '\0'; /* 余計な \ をつぶす */
/* sprintf( tmp, "%-*s", CLIP_SIZ, tmp ) ; */
strcpy( tmp, formstrL( tmp, CLIP_SIZ ) ) ;
tmp[CLIP_SIZ] = '\0' ;
wrt( tmp, CLIP_X+FNT_SPC_X, CLIP_Y+FNT_SPC_Y,
WHITE_h, WIND_COL, FNT_SIZ ) ;
/* マーク・ファイルがあったら消去 */
if (marked >= files.top && marked < files.top+DSP_MAX)
dsp_mark(marked - files.top);
files.twp = wp ;
files.top = top ;
/* 下地を描く */
if (rewrite)
pbox(DSP_X,DSP_Y, DSP_X+DSP_LEN*8+5,DSP_Y+DSP_MAX_SLOT*SPC_Y-1,
WIND_COL,WIND_COL);
/* スクロール・バーを描く */
DSP_scr_bar(rewrite);
/* ファイル名表示 */
for (i = 0; wp != NULL && i < DSP_MAX; i++)
{
dsp_file(wp,i, rewrite,ON);
wp = wp->next;
}
for (; i < DSP_MAX; i++)
{
dsp_clear_slot(i);
}
MOS_disp(MOS_ON);
}
static void dsp_card(int flush) /* WILD CARD 表示 */
{
auto int i;
static CDBUF cardbuf[CARD_MAX];
EVT_level_free(2);
MOS_disp(mos_disp_off);
if (flush)
dsp_box(CARD_X-2,CARD_Y-2,
CARD_X+CARD_LEN*8+4+2,CARD_Y+(CARD_MAX-1)*SPC_Y+SIZ_Y+2,
BOX1_COL,BOX2_COL,WIND_COL);
for (i = 0; i < CARD_MAX; i++)
{
if (card[i].name != NULL)
EVT_set_node(CARD_X,CARD_Y+i*SPC_Y, CARD_LEN*8+4,SIZ_Y,
2,MENU_clip,MEv_MAX+i+DSP_MAX_EVT, NOP);
if (flush || cardbuf[i].name != card[i].name ||
cardbuf[i].mark != card[i].mark)
{
cardbuf[i].name = card[i].name;
cardbuf[i].mark = card[i].mark;
if (card[i].name != NULL)
{
dsp_box(CARD_X,CARD_Y+i*SPC_Y,
CARD_X+CARD_LEN*8+4,CARD_Y+i*SPC_Y+SIZ_Y,
BOX1_COL,BOX2_COL,
card[i].name != NULL &&
card[i].mark != FALSE ? HIT_COL:WIND_COL);
wrt(formname(card[i].name),
CARD_X+FNT_SPC_X, CARD_Y+FNT_SPC_Y+SPC_Y*i,
WHITE_h, card[i].mark != FALSE ? HIT_COL:WIND_COL,
FNT_SIZ);
}
else
dsp_box(CARD_X,CARD_Y+i*SPC_Y,
CARD_X+CARD_LEN*8+4,CARD_Y+i*SPC_Y+SIZ_Y,
WIND_COL, WIND_COL, WIND_COL);
}
}
MOS_disp(MOS_ON);
}
/*
* ワイルドカード表示部分の、指定番号スロットの周囲に枠を描く
*/
static void dsp_card_slot(int slot)
{
/* if (card[slot].name != NULL) */
{
MOS_disp(mos_disp_off);
box(CARD_X-1,CARD_Y+slot*SPC_Y-1,
CARD_X+CARD_LEN*8+4+1,CARD_Y+slot*SPC_Y+SIZ_Y+1,
WHITE_h, 0xFFFFFFFF, MODE_XOR);
MOS_disp(MOS_ON);
}
}
/* ドライブ名パネルの表示 */
static void dsp_drive(int re_write)
{
static int last_cdrv = -1 ;
auto int DRV_X,DRV_Y, DRV_X_SIZ,DRV_X_SPC, DRV_NUM ;
auto int drv_x, drv_y ;
auto int i, n, dt ;
static int drv_max = ERR ;
int check_can_use_drive(int num) /* num = 1:A 2:B ... */
{
Registers.AX.R = 0x4408;
Registers.BX.R = num & 0xFF;
calldos();
if ((Registers.Flags & 1) == 0) /* エラーなし */
return Registers.AX.R; /* 交換可能:0 交換不能:1 */
else /* エラーあり */
return -1; /* エラー: -1 */
}
if (drv_max == ERR)
{
u_char info[200];
ESR_setupInfo((char *)info); /* システム情報取得 */
for (drv_max = i = 0; i < HARD_DRV_MAX; i++)
{
switch (disktype[i] = info[0x30 + i * 2])
{
case IS_FLP: /* FLOPPY DISK */
case IS_SCSI: /* SCSI HARD DISK */
case IS_RAM: /* RAM DISK */
case IS_ROM: /* ROM DISK */
break ;
case IS_MDC: /* MDC HARD DISK : 処理法が不明のため */
default: /* IS_NON(未割り当て) か 不明 */
disktype[i] = IS_NON ; /* 処理法が不明のため */
continue ;
}
drv_max++;
}
disktype[HARD_DRV_MAX] = IS_CDR; /* CD-ROM DRIVE */
drv_max++;
for (i = 0; i < DRV_MAX; i++)
if (disktype[i] == IS_NON) /* 空いているドライブすべて */
{
switch (check_can_use_drive(i+1))
{
case 1: /* 交換不能(HD) */
disktype[i] = IS_SCSI ; break ;
case 0: /* 交換可能(FD,ICMC,etc) */
disktype[i] = IS_FLP ; break ;
default:
continue ;
}
drv_max++;
}
getdir((char *)info);
CDRV = info[0] - 'A';
}
EVT_level_free( 3 ) ;
MOS_disp( mos_disp_off ) ;
DRV_X_SIZ = FNT_SPC_X*2 + 56 ;
DRV_X_SPC = FNT_SPC_X ;
DRV_NUM = 13*(2-drv_max/15) ;
if( drv_max > 14 )
DRV_X = 12, DRV_Y = 47 ;
else
DRV_X = 52, DRV_Y = 28, DRV_X_SIZ += 8, DRV_X_SPC += 4 ;
if( re_write )
{
last_cdrv = -1 ;
dsp_box( DRV_X - 2, DRV_Y - 2,
DRV_X + (DRV_X_SIZ + 2) * (drv_max / 15 + 1),
DRV_Y + (drv_max > 14 ? 12:(drv_max - 1)) * SPC_Y + SIZ_Y + 2,
BOX1_COL, BOX2_COL, WIND_COL);
}
for (i = n = 0; i < DRV_MAX; i++)
{
if ((dt = disktype[i]) != IS_NON)
{
drv_x = DRV_X + (n/DRV_NUM)*(DRV_X_SIZ+2) ;
drv_y = DRV_Y + (n%DRV_NUM)*SPC_Y ;
if( re_write || i == last_cdrv || i == CDRV )
{
dsp_box( drv_x, drv_y,
drv_x+DRV_X_SIZ, drv_y+SPC_Y-2,
BOX1_COL, BOX2_COL,
i == CDRV ? HIT_COL:WIND_COL ) ;
if( dt == 0 && i < 3 ) /* 内蔵FDは特別扱い */
dt = 7 ;
DSP_ptnColor( drv_x+DRV_X_SPC+2,drv_y+FNT_SPC_Y+1,
14,12, drv_icn[i], 1 ) ;
DSP_ptnColor( drv_x+DRV_X_SPC+21,drv_y+FNT_SPC_Y,
31,14, dev_icn[dt], 1 ) ;
}
EVT_set_node( drv_x,drv_y, DRV_X_SIZ,SPC_Y-2,
3, MENU_clip, MEv_MAX+i+DSP_MAX_EVT+CARD_MAX, NOP ) ;
n ++ ;
}
}
MOS_disp( MOS_ON ) ;
last_cdrv = CDRV ;
}
static void dsp_clip( void )
{
EVT_level_free( 4 ) ;
MOS_disp( mos_disp_off ) ;
dsp_box( CLIP_X-6,CLIP_Y-2, CLIP_X+CLIP_SIZ*8+FNT_SPC_X*2+5,CLIP_Y+SIZ_Y+2,
BOX1_COL,BOX2_COL,WIND_COL ) ;
dsp_box( DSP_X-2,ROLLUP_Y-2, ROLL_X+ROLL_LEN*8+4+1,ROLLDOWN_Y+SIZ_Y+2,
BOX1_COL,BOX2_COL,WIND_COL ) ;
BTN_set(CLIP_X,CLIP_Y, CLIP_SIZ*8+FNT_SPC_X*2+1,SIZ_Y, WIND_COL,
4,MENU_clip,MEv_UPPERDIR, NOP);
BTN_set( ROLL_X,ROLLUP_Y, ROLL_LEN*8+3,SIZ_Y, WIND_COL,
4,MENU_clip,MEv_vUP, REP ) ;
wrt( "▲", ROLL_X+FNT_SPC_X, ROLLUP_Y+FNT_SPC_Y,
WHITE_h,WIND_COL, FNT_SIZ ) ;
BTN_set( ROLL_X,ROLLDOWN_Y, ROLL_LEN*8+3,SIZ_Y, WIND_COL,
4,MENU_clip,MEv_vDOWN, REP ) ;
wrt( "▼", ROLL_X+FNT_SPC_X,ROLLDOWN_Y+FNT_SPC_Y,
WHITE_h,WIND_COL, FNT_SIZ ) ;
EVT_set_node(SCROLL_X,SCROLL_Y, SCROLL_X_SIZ,SCROLL_Y_SIZ,
6,MOVE_clip,MEv_DUMMY, NOP);
dsp_box( EXIT_X-3,EXIT_Y-3, EXIT_X+31,EXIT_Y+30,
BOX1_COL,BOX2_COL,WIND_COL ) ;
BTN_set( EXIT_X,EXIT_Y, 28,27, WIND_COL, 4,MENU_clip,MEv_EXIT, NOP ) ;
DSP_ptnColor( EXIT_X,EXIT_Y, 31,31, ptn_door, 1 ) ;
MOS_disp( MOS_ON ) ;
}
static void dsp_sort( int re_write )
{
EVT_level_free( 5 ) ;
MOS_disp( mos_disp_off ) ;
if( re_write )
{
dsp_box(SORT_X-2,SORT_Y-2,
SORT_X+SORT_LEN*8+4+2, SORT_Y+(SIZ_Y+2)*2,
BOX1_COL,BOX2_COL,WIND_COL ) ;
/* wrt( " ソート条件 ", SORT_X+FNT_SPC_X, SORT_Y+FNT_SPC_Y-1, */
wrt( " \x83\x5Cート条件 ", SORT_X+FNT_SPC_X, SORT_Y+FNT_SPC_Y-1,
WHITE_h,WIND_COL, FNT_SIZ ) ;
}
BTN_set( SORT_X,SORT_Y+(SIZ_Y+3)-2, SORT_LEN*8+4,SIZ_Y+1,
HIT_COL, 5,MENU_clip,MEv_SORTMD, REP ) ;
wrt( sort_name[setup.sort_mode],
SORT_X+FNT_SPC_X,SORT_Y+(SIZ_Y+3)+FNT_SPC_Y-2,
WHITE_h,HIT_COL, FNT_SIZ ) ;
MOS_disp( MOS_ON ) ;
}
static void dsp_column( int re_write )
{
EVT_level_free( 7 ) ;
MOS_disp( mos_disp_off ) ;
if( re_write )
{
dsp_box(COLUMN_X-2,COLUMN_Y-2,
COLUMN_X+COLUMN_LEN*8+4+2, COLUMN_Y+(SIZ_Y+2)*2,
BOX1_COL,BOX2_COL,WIND_COL ) ;
/* wrt( " 表示形式 ", COLUMN_X+FNT_SPC_X, COLUMN_Y+FNT_SPC_Y-1, */
wrt( " \x95\x5C示形式 ", COLUMN_X+FNT_SPC_X,COLUMN_Y+FNT_SPC_Y-1,
WHITE_h,WIND_COL, FNT_SIZ ) ;
}
BTN_set( COLUMN_X,COLUMN_Y+(SIZ_Y+3)-2, COLUMN_LEN*8+4,SIZ_Y+1,
HIT_COL, 7,MENU_clip,MEv_DISPMD, REP ) ;
wrt(fs_mode_name[setup.fs_mode-1],
COLUMN_X+FNT_SPC_X,COLUMN_Y+SIZ_Y+1+FNT_SPC_Y,
WHITE_h,HIT_COL,FNT_SIZ);
MOS_disp( MOS_ON ) ;
}
static void RIGHT_click( void )
{
event = MEv_CANCEL;
}
/* 削除する。失敗したらERRを返す */
static int wc_del( int no )
{
int i, j ;
int find ;
if( !card[no].allocate || card[no].name == NULL )
return ERR ;
free( card[no].name ) ;
for( i = no ; i < CARD_MAX ; i ++ )
{
find = FALSE ;
for( j = i + 1 ; j < CARD_MAX ; j ++ )
if( card[j].name != NULL )
{
card[i].name = card[j].name ;
card[i].mark = card[j].mark ;
card[i].allocate = card[j].allocate ;
card[j].name = NULL ;
card[j].mark = FALSE ;
card[j].allocate = TRUE ;
find = TRUE ;
break ;
}
if( !find )
{
card[i].name = NULL ;
card[i].mark = FALSE ;
card[i].allocate = TRUE ;
break ;
}
}
return( ERR+1 ) ;
}
void wc_init( void )
{
int i ;
for( i = 0; i < CARD_MAX; i++ )
wc_del(i);
}
/* ワイルドーカードを追加する。
* 登録成功か、すでに登録されていた場合はスロット番号を返す。
* 失敗なら ERR を返す
*/
int wc_apend( char *name, int mode )
{
int i ;
char *p ;
if( ( p = jstrrchr( name, '\\' ) ) != NULL )
name = p + 1 ;
for( p = name = strdup( name ) ; *p != '\0' ; p ++ )
*p = toup( *p ) ;
for( i = 0 ; i < CARD_MAX ; i++ )
if( card[i].name != NULL && strcmp( card[i].name, name ) == 0 )
{
if( mode == TRUE )
card[i].mark = card[i].mark != FALSE ? FALSE:TRUE ;
return( i ) ;
}
for( i = 0 ; i < CARD_MAX ; i++ )
{
if( card[i].name == NULL )
{
card[i].name = name ;
card[i].mark = mode ;
return( i ) ;
}
}
return( ERR ) ;
}
static void set_fs_mode( int mode )
{
switch( mode )
{
case 1: setup.fs_mode = 1 ; DSP_MAX = DSP_MAX1 ; break ;
case 2: setup.fs_mode = 2 ; DSP_MAX = DSP_MAX2 ; break ;
}
files.maxl = (files.max + setup.fs_mode - 1) / setup.fs_mode * setup.fs_mode;
}
static void screen_setup( int flag )
{
if (flag == ON)
{
DSP_writePage( gwork, 1 ) ;
#if MOUSE_PAGE!=1
MOS_writePage( 1 ) ;
MOS_horizon( 2, 630 ) ;
MOS_vertical( 0, 470 ) ;
#endif
EVT_control_ground( OFF ) ;
EVT_control_cancel( ON ) ;
mos_disp_off = MOS_OFF ; /* マウスカーソルを消す */
}
else
{
#if MOUSE_PAGE==1
mos_disp_off = MOS_ON ; /* マウスカーソルを消す必要がない */
#endif
EVT_control_cancel( OFF ) ;
EVT_control_ground( ON ) ;
mos_backup( ON ) ;
DSP_writePage( gwork, 0 ) ;
#if MOUSE_PAGE!=1
MOS_writePage( 1 ) ;
MOS_horizon( 2, 630 ) ;
MOS_vertical( 0, 470 ) ;
#endif
mos_backup( OFF ) ;
mos_ptn( MOSCSR_FINGER ) ;
}
}
/*
* ファイル・セレクタのスクロール
*/
static WCBUF *up_scroll(WCBUF *wp, int *top) /* スクロール */
{
int tmp;
tmp = files.top + setup.fs_mode;
if (tmp + DSP_MAX > files.maxl)
return wp;
*top = tmp;
#if 0
if ((*top = files.top + setup.fs_mode) + DSP_MAX >= files.max)
*top = files.max - DSP_MAX;
#endif
if (*top > files.top)
{
wp = jump(*top);
dsp_all(FALSE, wp, *top);
}
return wp;
}
static WCBUF *down_scroll(WCBUF *wp, int *top) /* 逆スクロール */
{
if (files.top > 0)
{
if ((*top = files.top - setup.fs_mode) < 0)
*top = 0;
wp = jump(*top);
dsp_all(FALSE, wp, *top);
}
return wp;
}
/*
* ファイル・マークの設定と解除
*/
static void clear_mark(int redisp)
{
WCBUF *twp;
if (marked == -1) /* マークされていない */
return;
/* マークを解除 */
twp = jump(marked);
twp->mark = OFF;
if (redisp && marked >= files.top && marked < files.top + DSP_MAX)
dsp_mark(marked - files.top);
marked = -1;
}
static void set_mark(int num)
{
WCBUF *twp;
if (marked != -1) /* どれかがマークされている */
clear_mark(ON);
/* マークを設定 */
twp = jump(marked = num);
twp->mark = ON;
if (marked >= files.top && marked < files.top+DSP_MAX)
dsp_mark(marked - files.top);
}
/*
* ディレクトリ移動
*/
static int move_dir(char *newdir, char *last_dir)
{
WCBUF *wp = NULL;
int top = 0;
/* ディレクトリ情報をクリア */
files.topwp = wc_reset(files.topwp);
/* ディレクトリを移動 */
chdir(newdir);
if (getdir(crrdir) == 0) /* No Error */
wp = files.topwp = wc_open();
/* 以前いたディレクトリをマーク */
if (last_dir != NULL && strlen(last_dir) > 0)
{
for (top = 0; wp != NULL; wp = wp->next, top++)
{
if (strcmp(wp->name, last_dir) == 0)
{
wp->mark = ON;
marked = top;
break;
}
}
if ((top -= DSP_MAX / 2) < 0)
top = 0;
}
/* 行き過ぎていたら戻す */
if (top + DSP_MAX >= files.maxl) {
if ((top = files.maxl - DSP_MAX) < 0)
top = 0;
}
/* 再表示 */
top -= top % setup.fs_mode;
wp = jump(top);
dsp_all(TRUE, wp, top);
return top;
}
static keytbl_t wc_key[] = {
{0xFF5D, MEv_SORTMD }, /* PF1 : ソート条件 */
{0xFF5E, MEv_DISPMD }, /* PF2 : 表示形式 */
{0xFF5B, MEv_EXIT }, /* PF12 : EXIT */
{0xFF11, MEv_EXIT }, /* 'Q' : EXIT */
{ 0x4F, MEv_uUP }, /* ← : 前選択 */
{ 0x51, MEv_uDOWN }, /* → : 次選択 */
{ 0x14F, MEv_hUP }, /* S+← : 高速前選択 */
{ 0x151, MEv_hDOWN }, /* S+→ : 高速次選択 */
{ 0x4D, MEv_sUP }, /* ↑ : 上選択 */
{ 0x50, MEv_sDOWN }, /* ↓ : 下選択 */
{ 0x14D, MEv_mUP }, /* S+↑ : 高速上選択 */
{ 0x150, MEv_mDOWN }, /* S+↓ : 高速下選択 */
{ 0x24D, MEv_vUP }, /* C+↑ : 逆スクロール */
{ 0x250, MEv_vDOWN }, /* C+↓ : スクロール */
{ 0x100, MEv_REPEAT }, /* SHIFT : ダミー発生 */
{0xFF01, MEv_CANCEL }, /* ESC : CANCEL */
{0xFF0E, MEv_ROOTDIR }, /* \ : ルートへ移動 */
{0xFF0F, MEv_UPDIR }, /* BS : ひとつ上のディレクトリへ移動 */
{0xFF1D, MEv_SELECT }, /* CR : 決定 */
{0xFF73, MEv_SELECT }, /* 実行 : 決定 */
{0xFF26, MEv_LOGDRV }, /* 'L' : ドライブ選択 */
{0xFF12, MEv_WILDCARD }, /* 'W' : ワイルドカード入力 */
{ -1, MEv_NULL }, /* おしまい */
};
/*
* ファイルを選択する
*/
char *file_select(int enable_cancel)
{
static int top = 0;
WCBUF *wp;
char *file = NULL;
char *p;
int now_mouse, now_mark, now_wild = -1;
int last_mouse = -1, last_mark = -1, d_click;
int start, i, lines, num;
mevt_t raw_event = MEv_NULL;
HEADER *hd = NULL;
LINPTR *lp = NULL;
dpl_t *dot = NULL;
#if MOUSE_PAGE==1
mos_disp_off = MOS_ON; /* マウスカーソルを消す必要がない */
#endif
MOS_disp(MOS_OFF);
EVT_reset();
cls(1, 0);
cls(0, 8);
mos_backup(ON);
MOS_writePage(MOUSE_PAGE);
MOS_horizon(2, 630);
MOS_vertical(0, 470);
mos_backup(OFF);
set_mos_ptn(MOSCSR_CLOCK); /* waiting cursor */
dsp_drive(TRUE); /* ドライブ名選択リスト */
dsp_card(TRUE); /* ワイルドカード選択リスト */
dsp_sort(TRUE); /* ソートモード選択リスト */
dsp_column(TRUE); /* ファイル表示モード選択リスト */
dsp_clip(); /* タイトルライン表示 */
getdir(crrdir); /* 現在のディレクトリ */
set_fs_mode(setup.fs_mode);
files.topwp = wc_open();
if (top + DSP_MAX >= files.maxl)
if ((top = files.maxl - DSP_MAX) < 0)
top = 0;
if (marked != -1)
(jump(marked))->mark = ON;
wp = jump(top);
dsp_all(TRUE, wp, top);
EVT_control_cancel(OFF);
EVT_set_ground(10, RIGHT_click, RIGHT);
EVT_control_ground(ON);
MOS_disp(MOS_ON);
for (;;)
{
if (get_mos_ptn() == MOSCSR_CLOCK)
mos_ptn(MOSCSR_FINGER);
event = MEv_NULL;
do {
event = key_event(kb_check(), wc_key);
if ((raw_event == MEv_mUP || raw_event == MEv_mDOWN) &&
event == MEv_NULL && !ISDIR(wp))
{
event = MEv_SELECT;
}
EVT_loop(1, 10);
} while (event == MEv_NULL || event == MEv_REPEAT);
raw_event = event;
if (event == MEv_WILDCARD) { /* ワイルドカード選択開始 */
if (now_wild == -1) {
now_wild = 0; /* 0番目にマークセット */
dsp_card_slot(now_wild);
wait_repeat(); /* キーから手を離すまで待つ */
continue;
}
}
if (now_wild != -1) /* ワイルドカード選択 */
{
if (event == MEv_sUP) {
dsp_card_slot(now_wild);
if (--now_wild < 0)
now_wild = 0;
dsp_card_slot(now_wild);
wait_repeat(); /* キーから手を離すまで待つ */
continue;
}
if (event == MEv_sDOWN) {
dsp_card_slot(now_wild);
if (++now_wild >= CARD_MAX)
now_wild = CARD_MAX - 1;
dsp_card_slot(now_wild);
wait_repeat(); /* キーから手を離すまで待つ */
continue;
}
if (event == MEv_SELECT)
{
card[now_wild].mark = !card[now_wild].mark;
wait_repeat(); /* キーから手を離すまで待つ */
num = now_wild;
goto RE_PRINT;
}
if (event == MEv_CANCEL)
{
dsp_card_slot(now_wild);
now_wild = -1;
wait_repeat(); /* キーから手を離すまで待つ */
goto RE_PRINT;
}
}
if (event == MEv_SELECT) /* 決定 */
{
if (marked < top || marked > top + DSP_MAX) /* 画面の外 */
;
else /* 画面の中 */
event = MEv_MAX + marked - top;
}
if (event == MEv_LOGDRV) /* ドライブ選択 */
{
screen_setup(ON);
num = select_drive();
screen_setup(OFF);
if (num >= 0 && disktype[num] != IS_NON) /* 有効なドライブ */
event = MEv_MAX + DSP_MAX_EVT + CARD_MAX + num;
else
continue;
}
if (event == MEv_sUP || event == MEv_mUP ||
event == MEv_uUP || event == MEv_hUP)
{ /* ↑ */
num = (event == MEv_uUP || event == MEv_hUP) ? 1 : setup.fs_mode;
if (marked != -1) /* マークファイルがある時 */
{
if (marked <= (num - 1)) /* ディレクトリの先頭 */
continue;
else if (marked < top || marked > top + DSP_MAX) /* 画面の外 */
event = MEv_MAX + DSP_MAX - 1;
else if (marked <= top + (num - 1))
{ /* 画面の先頭 */
event = MEv_MAX + marked - top - num + setup.fs_mode;
clear_mark(ON);
wp = down_scroll(wp, &top);
} else /* 画面の中 */
event = MEv_MAX + marked - top - num;
}
else /* マークファイルがない時 */
event = MEv_MAX + DSP_MAX - 1;
if (event < 0)
continue;
if (event >= MEv_MAX + files.max - files.top)
event = MEv_MAX + files.max - files.top - 1;
wait_repeat(); /* キーから手を離すまで待つ */
}
else if (event == MEv_sDOWN || event == MEv_mDOWN ||
event == MEv_uDOWN || event == MEv_hDOWN) /* ↓ */
{
num = (event == MEv_uDOWN || event == MEv_hDOWN) ? 1:setup.fs_mode;
if (marked != -1) { /* マークファイルがある時 */
if (marked < files.top ||
marked > files.top + DSP_MAX)
/* 画面の外 */
event = MEv_MAX;
else if (marked > files.max - num - 1)
continue; /* ディレクトリの最後 */
else if (marked >= top + DSP_MAX - num)
{ /* 画面の最後 */
event = MEv_MAX + marked - top + num - setup.fs_mode;
clear_mark(ON);
wp = up_scroll(wp, &top);
} else /* 画面の途中 */
event = MEv_MAX + marked - top + num;
}
else /* マークファイルがない時 */
event = MEv_MAX;
if (event >= MEv_MAX + files.max - files.top)
continue;
wait_repeat(); /* キーから手を離すまで待つ */
}
if (event == MEv_CANCEL)
{
if (enable_cancel) /* CANCEL */
{
file = "\0";
break;
}
}
else if (event == MEv_DUMMY) /* スクロールバーによる */
{
top = files.top;
}
else if (event == MEv_vDOWN) /* スクロール */
{
wp = up_scroll(wp, &top);
}
else if (event == MEv_vUP) /* 逆スクロール */
{
wp = down_scroll(wp, &top);
}
else if (event == MEv_UPPERDIR || /* 上方のディレクトリへ移動 */
event == MEv_ROOTDIR || /* ルートディレクトリへ移動 */
event == MEv_UPDIR) /* ひとつ上のディレクトリへ移動 */
{
if (event == MEv_ROOTDIR) /* ルートディレクトリへ移動 */
click_pos = 0;
if (event == MEv_UPDIR) /* ひとつ上のディレクトリ */
{
if (strlen(crrdir) > 3)
crrdir[strlen(crrdir)-1] = '\0';
else
continue;
if ((p = jstrrchr(crrdir, '\\')) != NULL)
click_pos = p - crrdir - 1;
}
if (click_pos < strlen(crrdir))
{
char last_dir[256] = '\0';
clear_mark(OFF); /* マークファイルを解除 */
if (click_pos < 3) /* ルート */
{
if (strlen(crrdir) > 3)
strncpy(last_dir, crrdir + 3, 255);
else
continue;
*(crrdir + 3) = '\0';
}
else
{
if ((p = jstrchr(crrdir + click_pos, '\\')) == NULL ||
*(p + 1) == '\0')
continue; /* カレント */
else
*p = '\0', strncpy(last_dir, p+1, 255);
}
if ((p = jstrchr(last_dir, '\\')) != NULL)
*p = '\0';
mos_ptn(MOSCSR_CLOCK);
top = move_dir(crrdir, last_dir);
}
}
else if (event == MEv_SORTMD) /* ソート条件 */
{
int sort;
screen_setup(ON);
sort = select_drag(EVT_get_node(5, MEv_SORTMD), FALSE,
SORT_X,SORT_Y+SIZ_Y*2+3, 99, sort_name, "123");
screen_setup(OFF);
if( sort >= 0 && sort != setup.sort_mode )
{
setup.sort_mode = sort ;
dsp_sort( FALSE ) ;
wc_reset( files.topwp ) ;
files.topwp = wc_open() ;
clear_mark(OFF); /* マークファイルを解除 */
dsp_all( TRUE, files.topwp, 0 ) ;
}
}
else if (event == MEv_EXIT) /* 直接終了ボタン */
{
screen_setup(ON);
if (check_exit() == 1)
break;
screen_setup(OFF);
}
else if (event == MEv_DISPMD) /* ファイル表示モードを変更 */
{
int mode ;
screen_setup(ON);
mode = select_drag(EVT_get_node(7, MEv_DISPMD),FALSE,
COLUMN_X+1,COLUMN_Y+SIZ_Y*2+3, 97,fs_mode_name, "12");
screen_setup(OFF);
if (mode >= 0 && mode+1 != setup.fs_mode)
{
set_fs_mode(mode + 1);
dsp_column(FALSE); /* ファイル表示モード */
if ((top = files.top) + DSP_MAX >= files.maxl)
if ((top = files.maxl - DSP_MAX) < 0)
top = 0;
top -= top % setup.fs_mode;
wp = jump(top);
dsp_all(TRUE, wp, top);
}
}
else if ((num = event - MEv_MAX) >= 0 && num < DSP_MAX)
{ /* ファイルを選択 */
top = files.top;
wp = jump(files.top + num);
if (rbtn(stat_sw) == TRUE) /* 右クリックによる選択 */
{
if (*(p = subname(wp->name)) != '\0')
{ /* 拡張子があれば */
char tmp[32] ;
/* sprintf( tmp, "*.%s", p ) ; */
strcpy( tmp, "*." ) ; strcpy( tmp+2, p ) ;
event = wc_apend(tmp, TRUE) + DSP_MAX_EVT;
goto RE_PRINT;
}
}
if (ISDIR(wp)) /* ディレクトリ選択 */
{
/* キーボードによる通過 */
if (raw_event != event && raw_event != MEv_SELECT)
{
set_mark(files.top + num);
continue;
}
/* 指定のディレクトリへ移動 */
mos_ptn(MOSCSR_CLOCK);
clear_mark(OFF); /* マークファイルを解除 */
if (strcmp(wp->name, "..") == 0) /* ひとつ上へ移動 */
{
char last_dir[256] ;
crrdir[strlen(crrdir)-1] = '\0' ;
strncpy( last_dir, jstrrchr( crrdir, '\\' ) + 1, 255 ) ;
top = move_dir(wp->name, last_dir);
}
else /* 指定の下位ディレクトリへ移動 */
{
top = move_dir(wp->name, NULL);
}
}
else /* ファイル指定 */
{
char tmpfile[256];
set_mark(files.top + num); /* マーク設定 */
if (raw_event == MEv_mUP || raw_event == MEv_mDOWN ||
raw_event == MEv_hUP || raw_event == MEv_hDOWN)
continue;
/* ダブル・クリックの確認 */
now_mouse = MOS_getTime();
now_mark = num + top;
if (now_mark == last_mark &&
now_mouse <= last_mouse + setup.db_click)
d_click = TRUE;
else
d_click = FALSE;
last_mouse = now_mouse;
last_mark = now_mark;
if (wp->size == 0) /* 空のファイルはパス */
continue;
if (d_click) /* ダブル・クリックならば */
{
strcat( crrdir, wp->name ) ; /* フルパスにして渡す */
file = crrdir ;
break ;
}
strcpy( tmpfile, crrdir ) ; /* フルパスにする */
strcat( tmpfile, wp->name ) ;
backup_file( BACKUP ) ;
dot = get_now_dpl() ;
if( ( hd = read_sub( tmpfile, FILE_PREVIEW ) ) == NULL )
continue ;
start = dot->max_y-1
- ( ( dot->font*(dot->max_y-1) + dot->ofs ) - 316 )/dot->font ;
lines = start*dot->font + dot->ofs - 2 ;
pbox( 2,lines, 645,480, CHR_COL,BAK_COL ) ;
wrt( dsp_name( wp, ON ),
X_DOTOFS,lines-18,CHR_COL,BAK_COL,FNT_SIZ ) ;
for( lines=1, i = start ;
i < dot->max_y && lines < hd->line_max ;
i++, lines++ )
{
lp = &(base[lines/LINEPTRs]->ptr[lines%LINEPTRs]) ;
dsp_line( i, lp->buf, lp->bytes ) ;
}
free_head() ;
backup_file( RESTORE ) ;
}
last_mouse = MOS_getTime() ;
}
else if ((num -= DSP_MAX_EVT) < CARD_MAX) /* ワイルド・カード */
{
if (rbtn(stat_sw) == TRUE) /* 右クリックによる選択 */
{
if (wc_del(num) != ERR)
goto RE_PRINT ;
continue ;
}
if (card[num].name != NULL)
{
card[num].mark = card[num].mark != FALSE ? FALSE:TRUE ;
RE_PRINT:
dsp_card(FALSE);
/* "*.*" が押されてない時だけ */
if (num == 0 || card[0].mark == FALSE)
{
wc_reset(files.topwp);
files.topwp = wc_open();
clear_mark(OFF); /* マークファイルを解除 */
dsp_all(TRUE, files.topwp, 0);
}
}
}
else if ((num -= CARD_MAX) < DRV_MAX) /* ドライブ・セレクト */
{
mos_ptn(MOSCSR_CLOCK);
chdrv(CDRV = num);
#ifdef CD_NO_STOP
if (disktype[num] == IS_CDR) /* CDだったら、連続にセット */
for (i = 0; i < 1000 && cdr_stptime(0, 0) == 0x80; i++) ;
/* メディア交換直後ならば、リトライする */
/* 無限ループに陥らないように・・・ */
#endif
dsp_drive(FALSE);
files.topwp = wc_reset(files.topwp);
if (getdir(crrdir) == 0) /* No Error */
files.topwp = wc_open();
clear_mark(OFF); /* マークファイルを解除 */
dsp_all(TRUE, files.topwp, 0);
}
}
EVT_reset() ;
MOS_disp( MOS_OFF ) ;
wc_reset( files.topwp ) ;
cls( 0, 0 ) ;
cls( 1, 0 ) ;
MOS_writePage( 0 ) ;
mos_disp_off = MOS_OFF ; /* マウスカーソルは消さなければならない */
return file ;
}